package com.wsoft.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wsoft.core.exception.Asserts;
import com.wsoft.core.service.ModuleService;
import com.wsoft.core.vo.ModuleVO;
import com.wsoft.entity.TsModuleEntity;
import com.wsoft.manager.TsModuleManager;
import com.wsoft.mapper.TsModuleMapper;
import com.wsoft.query.module.ModuleIdQuery;
import com.wsoft.query.module.ModuleInsertQuery;
import com.wsoft.query.module.ModuleListQuery;
import com.wsoft.query.module.ModuleUpdateQuery;
import com.wsoft.service.ITsModuleService;
import com.wsoft.vo.ModuleNameVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 模块表 服务实现类
 * </p>
 *
 * @author Z001
 * @since 2024年12月17日 09:48:45
 */
@Service
public class TsModuleServiceImpl extends ServiceImpl<TsModuleMapper, TsModuleEntity> implements ITsModuleService, ModuleService {

    @Resource
    private TsModuleManager moduleManager;

    /**
     * 新增模块
     * @param query
     * @return
     */
    @Override
    public boolean insertModule(ModuleInsertQuery query) {
        //校验code
        checkCode(query.getCode(),null);
        return moduleManager.save(Convert.convert(TsModuleEntity.class, query));
    }

    /**
     * 修改
     * @param query
     * @return
     */
    @Override
    public boolean updateModule(ModuleUpdateQuery query) {
        //校验code
        checkCode(query.getCode(),query.getId());
        return  moduleManager.updateById(Convert.convert(TsModuleEntity.class, query));
    }

    /**
     * 获取详情
     */
    @Override
    public TsModuleEntity getModuleInfo(Long id) {
        return moduleManager.getById(id);
    }

    /**
     * 根据id删除
     * @param id
     * @return
     */
    @Override
    public boolean deleteModule(Long id) {
        return moduleManager.removeById(id);
    }

    /**
     * 列表查询
     * @param query
     * @return
     */
    @Override
    public PageInfo<TsModuleEntity> listModule(ModuleListQuery query) {
        PageHelper.startPage(query.getPageNum(), query.getPageSize());
        return PageInfo.of(moduleManager.listModule(query));
    }

    @Override
    public List<TsModuleEntity> listAll() {
        return moduleManager.listModule(new ModuleListQuery());
    }

    /**
     * 获取模块名称
     * @param query
     * @return
     */
    @Override
    public List<ModuleNameVO> getModuleName(ModuleIdQuery query) {
        if(CollUtil.isEmpty(query.getModuleIdList())){
            return new ArrayList<>();
        }
        List<TsModuleEntity> list = moduleManager.listByIds(query.getModuleIdList());
        return list.stream().sorted(Comparator.comparing(TsModuleEntity::getSort)).map(item-> Convert.convert(ModuleNameVO.class,item)).collect(Collectors.toList());
    }

    @Override
    public List<ModuleVO> listModuleAll(Integer isEnable) {
        ModuleListQuery query = new ModuleListQuery();
        query.setIsEnable(isEnable);
        List<TsModuleEntity> list = moduleManager.listModule(query);
        return list.stream().map(item->Convert.convert(ModuleVO.class,item)).collect(Collectors.toList());
    }

    @Override
    public ModuleVO getByModuleId(Long moduleId) {
        TsModuleEntity moduleEntity = moduleManager.getById(moduleId);
        return Convert.convert(ModuleVO.class,moduleEntity);
    }

    // ################################## 私有方法  ##################################


    /**
     * 校验code
     * @param code
     * @param id
     */
    private void checkCode(String code,Long id){
        TsModuleEntity entity = moduleManager.getByCode(code);
        //新增
        if(null == id && entity != null){
            Asserts.fail("[module.code.exist]");
        }
        //编辑
        if(null != id && entity != null && !id.equals(entity.getId())){
            Asserts.fail("[module.code.exist]");
        }
    }


}
